package com.blog.core;

import com.blog.util.FileUtils;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 代码生成器的核心处理类
 * 使用freemarker完成文件生成
 * 数据模型 + 模板
 * 数据：
 * 数据模板
 * 模板的位置
 * 生成文件的路径
 */
public class Generator {

    private String templatePath;// 模板路径
    private String outPath;// 代码生成路径
    private Configuration configuration;

    public Generator(String templatePath, String outPath) {
        this.templatePath = templatePath;
        this.outPath = outPath;
        // configuration实例化
        configuration = new Configuration();
        try {
            // 指定模板加载器
            FileTemplateLoader ftl = new FileTemplateLoader(new File(templatePath));
            configuration.setTemplateLoader(ftl);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 代码生成
     *      1.扫描模板路径下的所有模板
     *      2.对每个模板进行文件生成（数据库模型）
     */
    public void scanAndGenerator(Map<String, Object> dataModel) {
        try {
            // 1.根据模板路径找到此路径下的所有模板文件
            List<File> fileList = FileUtils.searchAllFile(new File(templatePath));
            // 2.对每个模板进行文件生成
            for (File file : fileList) {
                executeGenerator(dataModel, file);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 对模板进行文件生成
     * @param dataModel 数据模型
     * @param file 模板文件
     *             模板文件： com.blog.system.xxx.java
     */
    private void executeGenerator(Map<String, Object> dataModel, File file) {
        try {
            // 1.文件路径处理 (C:/模板/cn/blog/User.java)
            String templateFileName = file.getAbsolutePath().replace(this.templatePath, "");
            String outFileName = processTemplateString(templateFileName, dataModel);
            // 2.读取文件模板
            Template template = configuration.getTemplate(templateFileName);
            template.setOutputEncoding("utf-8");// 指定生成文件的字符编码
            // 3.创建文件
            File file1 = FileUtils.mkdir(outPath, outFileName);
            // 4.模板处理（文件生成）
            FileWriter fw = new FileWriter(file1);
            template.process(dataModel, fw);
            fw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private String  processTemplateString(String templateString, Map dataModel) throws Exception {
        StringWriter out = new StringWriter();
        Template template = new Template("ts", new StringReader(templateString), configuration);
        template.process(dataModel, out);
        return out.toString();
    }

    public static void main(String[] args) {
        String templatePath = "C:\\Users\\baidu\\Desktop\\news\\模板";
        String outPath = "C:\\Users\\baidu\\Desktop\\news\\代码生成";
        Generator generator = new Generator(templatePath, outPath);
        Map<String, Object> dataModel = new HashMap<>();
        dataModel.put("username", "大明太祖爷洪武皇帝朱元璋");
        generator.scanAndGenerator(dataModel);
    }

}
